package com.jackrain.nea.ext.oss;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Getter;

import java.util.Map;
import java.util.function.Function;

/**
 * 表示静态存储的对象
 *
 * @author blqw
 * @date 2017-12
 */
public class OssObject {
    @Getter
    private final String key;
    @Getter
    private final String domain;
    @Getter
    private final String bucket;
    private Function<OssObject, Map<String, String>> getdata;

    private JSONObject props;

    private Map<String, String> data;

    /**
     * 初始化
     *
     * @param bucket
     * @param domain
     * @param key
     * @param getdata
     */
    public OssObject(String bucket, String domain, String key, Function<OssObject, Map<String, String>> getdata) {
        this.key = key;
        this.domain = domain;
        this.bucket = bucket;
        this.getdata = getdata;
        this.data = null;
    }

    /**
     * 带有额外属性的初始化
     *
     * @param bucket
     * @param domain
     * @param key
     * @param data
     */
    public OssObject(String bucket, String domain, String key, Map<String, String> data) {
        this.key = key;
        this.domain = domain;
        this.bucket = bucket;
        this.data = data;
    }

    /**
     * 对象唯一标识符(保留属性)
     *
     * @return
     */
    public String getId() {
        return getInfo("id");
    }

    /**
     * 对象名称
     *
     * @return
     */
    public String getName() {
        return getInfo("name");
    }

    /**
     * 对象扩展名
     *
     * @return
     */
    public String getExt() {
        return getInfo("ext");
    }

    /**
     * 一个额外的字符串(保留属性)
     *
     * @return
     */
    public String getTag() {
        return getInfo("tag");
    }

    /**
     * 对象扩展信息的JSON串(保留属性)
     *
     * @return
     */
    public String getPropsValue() {
        return getInfo("props");
    }

    /**
     * 获取对象扩展信息 (保留属性)
     *
     * @param name 扩展信息名称
     * @return
     */
    public Object getProp(String name) {
        return getProp(name, null);
    }

    /**
     * 获取对象扩展信息(保留属性)
     *
     * @param name         扩展信息名称
     * @param defaultValue 默认值
     * @return
     */
    public Object getProp(String name, Object defaultValue) {
        if (props == null && getPropsValue() != null) {
            props = JSON.parseObject(getPropsValue());
        }
        return props.getOrDefault(name, defaultValue);
    }

    /**
     * 获取对象信息
     *
     * @param name 信息名称
     * @return
     */
    public String getInfo(String name) {
        if(data == null && getdata!=null){
            data = getdata.apply(this);
            getdata = null;
        }
        return data != null ? data.getOrDefault(name, null) : null;
    }

    /**
     * 获取对象的完整路径
     *
     * @return
     */
    public String getFullUrl() {
        return domain.endsWith("/") ? domain + key : domain + "/" + key;
    }

    public boolean isFolder() {
        return key.charAt(key.length() - 1) == '/';
    }
}
